
# 安装beautifulsoup： pip install bs4

# 1.基本简介
#   1》beautifulsoup简称
#       bs4
#   2》什么是beautifulsoup？
#       BeautifulSoup 和lxml一样 是一个html解析器
#           主要功能也是解析数据和提取数据
#   3》优缺点
#       缺点：效率没有lxml高
#       优点：接口设计人性化 使用方便-

from bs4 import BeautifulSoup

# 通过解析本地文件  讲解bs4的基本语法
# 默认打开文件的格式是gbk 所以打开文件的时候需要指定编码
soup = BeautifulSoup(open('075.解析_bs4的基本使用.html', encoding='utf-8'), 'lxml')
# print(soup)

# 根据标签名字
# 找到的是第一个符合条件的数据
# print(soup.a)

# 获取标签的全部属性和属性值
# print(soup.a.attrs)


# bs4的一些函数
# (1) find

#   返回的是第一个符合条件的数据-
# print(soup.find('a'))

#   可以通过条件找到对应的标签(通过title的值来找到对应的标签对象)
# print(soup.find('a', title='a2'))

#   根据class的值来寻找标签对象时  注意： class需要添加下划线 eg：class_
# print(soup.find('a', class_='a1'))


# (2) find_all  <==>  findAll

# find_all返回的是列表 并且返回了所有的a标签
# print(soup.find_all('a'))
# print(soup.findAll('a'))

# 找到所有的a标签和所有span标签
#       如果想获取的是多个标签的数据 那么需要在find_all的参数中添加的是列表的数据-
# print(soup.find_all(['a', 'span']))
# print(soup.findAll(['a', 'span']))

# 获取所有的li
#   limit作用： 查找前几个数据
# print(soup.find_all('li', limit=2))


# (3) select(推荐)select方法返回的是一个列表    并且会返回多个数据

#   select方法返回的是一个列表    并且会返回多个数据-
# print(soup.select('a'))


# 可以通过. 代表class  我们把这种操作叫做类选择器
# print(soup.select('.a1'))


# 可以通过  # 代表id  我们把这种操作叫做 id选择器
# print(soup.select('#l1'))


# 属性选择器--通过属性来寻找对应的标签
# 查找到li中有id的标签
# print(soup.select('li[id]'))

# 查找li标签中id为l2的标签
# print(soup.select('li[id=l2]'))


# 层次选择器
#   后代选择器 空格
#   找到div下面的li
# print(soup.select('div li'))

# 子代选择器
#   某标签的第一级子标签
#   注意：很多的计算机编程语言中 如果不加空格不会输出内容
#       但是在bs4中 不会报错    会显示内容
# print(soup.select('ul>li'))
# print(soup.select('div > ul > li'))

# 找到a标签和li标签的所有对象
# print(soup.select('a,li, span'))


# 节点信息
#       获取节点内容-  得到是的列表  可通过索引获取对象
# obj = soup.select("#d1")[0]


# 如果标签对象中  只有内容  那么string和get_text()都可以使用
# 如果标签对象中  除了内容还有标签  那么string就获取不到数据  而get_text()是可以获取数据
# 我们一般情况下   推荐使用get_text()

# print(obj.string)
# print(obj.get_text())


# 节点的属性
# obj = soup.select("#p1")[0]

# name是标签的名字
# print(obj.name)

# 将属性值作为一个字典返回
# print(obj.attrs)


# 获取节点的属性
#   思路1：获取所有属性值  得到一个字典  再通过字典的get()方法获取节点属性
obj = soup.select("#p1")[0]
print(obj.attrs.get('class'))
#   思路2：不建议
print(obj.get('class'))
#   思路3
print(obj['class'])
